package com.harmonyos.cases.utils;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.harmonyos.cases.bean.cache.CacheType;
import com.harmonyos.cases.bean.repository.Result;
import org.apache.http.client.methods.HttpGet;

import java.io.*;
import java.nio.file.Files;
import java.util.List;

import static com.harmonyos.cases.utils.InsertUtils.getCacheDirectory;

public class DataReader {
    /**
     * 获取在线数据，并写入本地
     *
     * @param localConfigUlr 在线数据配置文件链接地址，debug版本可以修改
     * @param fileName       需要写入的本地文件名
     * @return 返回插件配置数据
     * @throws IOException 抛出IO异常
     */
    public List<Result> onlineData(String localConfigUlr, String fileName) throws IOException {
        if (CacheUtils.getInstance().update(CacheType.Config, "config")) {
            String config = "";
            // 获取在线数据
            String responseStr = HttpRequest.getInstance().executeGet(new HttpGet(localConfigUlr));
            if (responseStr != null) {
                // 如果在线数据格式正确，则进行赋值
                // 如果设置的config地址不是原始数据，则不使用在线数据，而是使用本地缓存数据
                if (!responseStr.startsWith("<!DOCTYPE html>") && !responseStr.startsWith("<html")) {
                    config = responseStr;
                }
            }
            if (config.isEmpty()) {
                return null;
            }
            // 解析json
            ObjectMapper mapper = new ObjectMapper();
            List<Result> resultList = mapper.readValue(config, new TypeReference<>() {
            });
            // 数据写入本地
            File localFile = new File(getCacheDirectory(), fileName);
            Files.writeString(localFile.toPath(), config);
            CacheUtils.getInstance().add(CacheType.Config, "config");
            return resultList;
        } else {
            return localData(fileName);
        }

    }

    /**
     * 如果在线数据获取失败，读取本地数据
     *
     * @param fileName 本地文件名
     * @return 返回配置数据
     * @throws IOException 抛出IO异常
     */
    public List<Result> localData(String fileName) throws IOException {
        // 读取本地数据
        File localFile = new File(getCacheDirectory(), fileName);
        if (!localFile.exists()) {
            return null;
        }
        String config = Files.readString(localFile.toPath());
        // 解析本地数据
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(config, new TypeReference<>() {
        });
    }

    /**
     * 如果在线或者本地数据全部获取失败，则读取插件中自带的配置文件，版本不是最新的，会随着插件发布进行更新
     *
     * @return 返回配置数据
     * @throws IOException 抛出IO异常
     */
    public List<Result> packageData() throws IOException {
        ClassLoader classLoader = getClass().getClassLoader();
        // 使用 ClassLoader 获取文件的输入流
        InputStream inputStream = classLoader.getResourceAsStream("config.json");
        if (inputStream != null) {
            // 创建 BufferedReader 来读取文件内容
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder content = new StringBuilder();
            String line;

            // 逐行读取文件内容
            while ((line = reader.readLine()) != null) {
                content.append(line).append("\n");
            }

            // 关闭输入流和读取器
            reader.close();
            inputStream.close();

            // 解析本地数据
            ObjectMapper mapper = new ObjectMapper();
            return mapper.readValue(content.toString(), new TypeReference<>() {
            });
        }
        return null;
    }
}
